import {
  // getters as gtypes,
  mutations as mtypes,
  actions as atypes
} from '../types' // 按需导入

const state = {
  a: 2
}

const getters = {
  getterA: state => state.a
}

const mutations = {
  // 如果一个函数不需要返回值，那么你在函数中返回或不返回都不影响
  updateA: (state, payload) => state.a = payload
}

const actions = {
  // 子模块中的 ctx 调用本模块的 mutation 或 action 时，默认是从当前模块开始检索的，type 不需要带模块名路径，
  // 而在其他地方直接使用 this.$store.commit(type, payload) 或 this.$store.dispatch(type, payload) 调用时，type 就需要带模块名路径，
  // 由于 types.js 文件中对于同一个 mutation 或 action 原则上应该只定义一个 type 字符串，
  // 所以，在子模块中调用的时候，type 就也要带上模块名路径，就必须从根模块调起，
  // 那么，如何在一个子模块的 action 中，调用到根模块或者其他模块的 action 或 mutation 呢？
  // 答案：通过第三个参数 { root: true } 就能从根模块开始调用。
  updateA: (ctx, payload) => ctx.commit(mtypes.comment_updateA, payload, { root: true }),

  // 转而去调用 updateA 这个 action
  updateB: (ctx, payload) => ctx.dispatch(atypes.comment_updateA, payload, { root: true })
}

export default {
  // 默认为 false，该子模块中所有的 getters、mutations、actions 都会挂载到根模块上
  // 改为 true 后，type 就需要带上模块名，可以避免命名冲突，推荐使用
  // 这个 namespaced 对 state 不起作用，也就是说，加不加 namespaced， state 的访问方式都一样，子模块需要 state.子模块名
  namespaced: true,
  state,
  getters,
  mutations,
  actions
}
